package com.yjy.json_test;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

/**
 * 需求描述：
 * 我们所有接口的请求参数继承一个公共类，用来存放公共字段。
 * 在处理公共的业务逻辑时只会传入该公共类，所以在处理业务逻辑时才会转成具体的业务请求类。
 * 比如说校验，公共参数校验可以使用统一参数，业务参数校验就需要特定校验类去处理。
 * 但是不同请求参数类中，可能某些字段校验逻辑是一样的，所以我们也可以用同一校验类去获取，但是传进来的是公共类，子类不明确，因此引入json获取某个字段值进行校验。
 */
public class MainTest {
    public static void main(String[] args) throws Exception {
        // 模拟父类获取子类某属性的值

        // 一、继承场景
        CommonReq payReq_pab = new PayReq() {{
            setTraderNo("1234");
        }};

        // 方式1
        System.out.println(JSON.toJSONString(payReq_pab));
        String traderNo = JSON.parseObject(JSON.toJSONString(payReq_pab)).getString("traderNo");
        System.out.println(traderNo);

        // 方式2
        JSONObject jsonObject = (JSONObject) JSON.toJSON(payReq_pab);
        System.out.println(jsonObject.get("traderNo"));

        // 二、属性场景
        CommonReq2<PayReq> commonReq2 = new CommonReq2(new PayReq() {{
            setTraderNo("1234");
        }});
        JSONObject jsonObject2 = (JSONObject) JSON.toJSON(commonReq2);
        JSONObject bizContent = (JSONObject)jsonObject2.get("bizContent");
        System.out.println(bizContent.getString("traderNo"));
    }

    static class CommonReq {
        private String code;

        public String getCode() {
            return code;
        }

        public void setCode(String code) {
            this.code = code;
        }
    }
    static class PayReq extends CommonReq {
        private String traderNo;

        public String getTraderNo() {
            return traderNo;
        }

        public void setTraderNo(String traderNo) {
            this.traderNo = traderNo;
        }
    }

    static class CommonReq2<T> {
        private String code;
        private String msg;
        private T bizContent;

        public CommonReq2(T bizContent) {
            this.bizContent = bizContent;
        }

        public String getCode() {
            return code;
        }

        public void setCode(String code) {
            this.code = code;
        }

        public String getMsg() {
            return msg;
        }

        public void setMsg(String msg) {
            this.msg = msg;
        }

        public T getBizContent() {
            return bizContent;
        }

        public void setBizContent(T bizContent) {
            this.bizContent = bizContent;
        }
    }

}
